package code.example.base.cpu.thread;

import code.example.tool.FixedThreadPool;

/**
 * 启动脚本：java -cp lib/*:*.jar  code.example.base.cpu.thread.ThreadSwitching
 *  环境： 主机8核cpu，死循环 thread.yield。
 *  现象：
 *           线程状态：java.io.FileOutputStream.write(Native Method): java.lang.Thread.State: RUNNABLE
 *
 *           vmstat: system cs 300-700。(正常情况下应为0)
 *                   r队列:8。          (8条线程在执行)
 *                   b队列:0。
 *                   cpu us: 6-7%左右。
 *                   cpu sy: 90%左右。
 *                   cpu load:7
 *  表明：
 *
 *          cpu us :6-7%左右，用户线程执行占用很少的CPU。
 *          cpu sy: 90%左右，cpu大部分使用用于系统内核操作：切换线程上下文（vmstat system cs :300-700,正常情况下应为0）：
 *                      8条线程，进入Running 状态,调用Thread.yield放弃CPU时间片，系统内核需要保存当前线程的状态，再找到其它Runnable的
 *                      线程，加载线程上下文等，执行线程，进入Running状态，执行用户代码Thread.yield ,又放弃了时间片。。。进入这样的循环过程。
 *                      系统内核不断的切换线程上下文，造成 cpu sy 过高。
 *
 *
 *         cpu load 7.5： 线程不断的在Runnable 和 Running 状态之间切换，Load =Running +Runnable + D(TOP 命令中显示为 D (TASK_UNTNTERRUPTIBLE))
 *                        Load =Running +Runnable = 8(条线程)
 *
 */

public class ThreadSwitching {

    public void testSwitch(){
        while(true){
            Thread.yield();
        }
    }
    public void test(){
        FixedThreadPool fixedThreadPool = new FixedThreadPool(8);
        for(int i=0;i<8;i++){
            final int id = i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    testSwitch();
                }
            });

        }
    }
    public static void main(String args []){
        new ThreadSwitching().test();
    }
}
